package fr.wisper.screens.gamescreen; import aurelienribon.tweenengine.BaseTween; import aurelienribon.tweenengine.Tween; import aurelienribon.tweenengine.TweenCallback; import aurelienribon.tweenengine.TweenManager; import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.Screen; import com.badlogic.gdx.assets.AssetManager; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.g2d.*; import com.badlogic.gdx.scenes.scene2d.*; import com.badlogic.gdx.scenes.scene2d.actions.Actions; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.Skin; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.utils.Scaling; import com.badlogic.gdx.utils.viewport.ScalingViewport; import fr.wisper.Game.WisperGame; import fr.wisper.assets.MenuAssets; import fr.wisper.dialog.ExitDialog; import fr.wisper.dialog.SpeechBubble; import fr.wisper.entities.Wisper; import fr.wisper.animations.tween.ImageAccessor; import fr.wisper.animations.tween.ParticleEffectAccessor; import fr.wisper.animations.tween.SpriteAccessor; import fr.wisper.screens.loading.LoadingScreen; import fr.wisper.utils.Config; import fr.wisper.utils.Debug; public class MainMenu implements FadingScreen { // Stage private ExtendedStage stage; private Group group; private Skin skin; // Buttons private Image startImageButton; private Image closeImageButton; private Image settingsImageButton; // Background image private Sprite splash; private SpriteBatch batch; private TweenManager tweenManager; // Black Wisper Wisper wisper; ClickListener wisperClickListener; long lastClickTime = 0; @Override public void render(float delta) { Gdx.gl.glClearColor(0.95f, 0.95f, 0.95f, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // Manage camera WisperGame.Camera.update(); batch.setProjectionMatrix(WisperGame.Camera.combined); // Display background image batch.begin(); splash.draw(batch); wisper.draw(batch, delta); batch.end(); // Act stage stage.draw(); stage.act(delta); // Update animations tweenManager.update(delta); } @Override public void resize(int width, int height) { WisperGame.Camera.zoom = 1f; WisperGame.Camera.updateViewport(); ScalingViewport stageViewport = new ScalingViewport( Scaling.fit, WisperGame.VirtualViewport.getVirtualWidth(), WisperGame.VirtualViewport.getVirtualHeight(), WisperGame.Camera); stage.setViewport(stageViewport); stage.getViewport().update(width, height, true); } @Override public void show() { // Apply preferences applyPreferences(); // Buttons initButtons(); // Stage skin = MenuAssets.manager.get(MenuAssets.GlobalSkin); stage = new ExtendedStage(skin); stage.addActor(group); stage.addActor(settingsImageButton); Gdx.input.setInputProcessor(stage); Gdx.input.setCatchBackKey(true); // Background image batch = new SpriteBatch(); splash = new Sprite(MenuAssets.manager.get(MenuAssets.SplashScreen)); splash.setSize(Config.APP_WIDTH, Config.APP_HEIGHT); // Animations initAnimations(); // Init wisper initWisper(); } private void initWisper() { // Wisper wisper = new Wisper("particles/black-wisper-noadditive.p"); wisperClickListener = new ClickListener() { @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { long currentTime = System.currentTimeMillis(); if (currentTime - lastClickTime < Config.DOUBLE_TAP_INTERVAL) { wisper.dash((int) x, (int) y, tweenManager); } else { wisper.moveTo((int) x, (int) y, tweenManager, null); } lastClickTime = currentTime; return super.touchDown(event, x, y, pointer, button); } }; stage.addListener(wisperClickListener); wisper.startIntroSpeech(); } private void applyPreferences() { Gdx.graphics.setVSync(SettingsMenu.vSync()); } private void initButtons() { startImageButton = new Image(MenuAssets.manager.get(MenuAssets.NewGameButton)); startImageButton.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { fadeTo(new WisperChooseMenu()); } }); startImageButton.addAction(Actions.moveBy(0, 150)); closeImageButton = new Image(MenuAssets.manager.get(MenuAssets.CloseWisperButton)); closeImageButton.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { Gdx.app.exit(); } }); settingsImageButton = new Image(MenuAssets.manager.get(MenuAssets.SettingsButton)); settingsImageButton.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { fadeTo(new SettingsMenu()); } }); settingsImageButton.setPosition( Config.APP_WIDTH - settingsImageButton.getWidth() - 40, 40); group = new Group(); group.addActor(startImageButton); group.addActor(closeImageButton); group.addAction(Actions.moveBy(75, 75)); } public void fadeTo(final FadingScreen screen) { wisper.stopDraw(); Tween.set(splash, SpriteAccessor.ALPHA).target(1).start(tweenManager); Tween.set(startImageButton, ImageAccessor.ALPHA).target(1).start(tweenManager); Tween.set(closeImageButton, ImageAccessor.ALPHA).target(1).start(tweenManager); Tween.set(settingsImageButton, ImageAccessor.ALPHA).target(1).start(tweenManager); Tween.to(closeImageButton, ImageAccessor.ALPHA, Config.ANIMATION_DURATION / 3f).target(0).start(tweenManager); Tween.to(settingsImageButton, ImageAccessor.ALPHA, Config.ANIMATION_DURATION / 3f).target(0).start(tweenManager); Tween.to(startImageButton, ImageAccessor.ALPHA, Config.ANIMATION_DURATION / 3f).target(0).start(tweenManager); Tween.to(splash, SpriteAccessor.ALPHA, Config.ANIMATION_DURATION / 3f).target(0).setCallback(new TweenCallback() { @Override public void onEvent(int type, BaseTween<?> source) { LoadingScreen loader = ((WisperGame) Gdx.app.getApplicationListener()).getLoader(); loader.setNextScreen(screen); } }).start(tweenManager); } @Override public AssetManager getAssetManager() { return MenuAssets.manager; } @Override public void load() { MenuAssets.load(); } private void initAnimations() { tweenManager = new TweenManager(); Tween.registerAccessor(Sprite.class, new SpriteAccessor()); Tween.registerAccessor(Image.class, new ImageAccessor()); Tween.registerAccessor(ParticleEffect.class, new ParticleEffectAccessor()); Tween.set(splash, SpriteAccessor.ALPHA).target(0).start(tweenManager); Tween.set(startImageButton, ImageAccessor.ALPHA).target(0).start(tweenManager); Tween.set(closeImageButton, ImageAccessor.ALPHA).target(0).start(tweenManager); Tween.set(settingsImageButton, ImageAccessor.ALPHA).target(0).start(tweenManager); Tween.to(splash, SpriteAccessor.ALPHA, Config.ANIMATION_DURATION).target(1).start(tweenManager); Tween.to(startImageButton, ImageAccessor.ALPHA, Config.ANIMATION_DURATION).target(1).delay(Config.ANIMATION_DURATION / 2f).start(tweenManager); Tween.to(closeImageButton, ImageAccessor.ALPHA, Config.ANIMATION_DURATION).target(1).delay(Config.ANIMATION_DURATION / 2f).start(tweenManager); Tween.to(settingsImageButton, ImageAccessor.ALPHA, Config.ANIMATION_DURATION).target(1).delay(Config.ANIMATION_DURATION / 2f).start(tweenManager); tweenManager.update(Float.MIN_VALUE); } @Override public void hide() { dispose(); } @Override public void pause() { } @Override public void resume() { } @Override public void dispose() { batch.dispose(); skin.dispose(); wisper.dispose(); MenuAssets.dispose(); } private class ExtendedStage extends Stage { private Skin skin; private ExitDialog dialog; public ExtendedStage(Skin skin) { super(); this.skin = skin; this.dialog = new ExitDialog("Confirm Exit", this.skin); } /* @Override public boolean touchDown(int screenX, int screenY, int pointer, int button) { Vector2 touchPos = Config.getProjectedCoordinates(screenX, screenY, getViewport()); wisper.moveTo((int)touchPos.x, (int)touchPos.y, tweenManager, getViewport()); return super.touchDown(screenX, screenY, pointer, button); } */ @Override public boolean keyDown(int keyCode) { if(keyCode == Input.Keys.ESCAPE || keyCode == Input.Keys.BACK){ dialog.show(this); } return super.keyDown(keyCode); } } }